package com.bdqn.mapper;

import com.bdqn.pojo.SysUser;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 系统用户数据库操作接口
 */
public interface SysUserMapper {

    /**
     * 获取数据库表中的总记录数
     *
     * @return
     */
    int count(Long roleId);

    /**
     * 获得系统用户表所有数据
     *
     * @return
     */
    List<SysUser> getList();

    /**
     * 根据真实姓名模糊匹配查询用户信息
     *
     * @param realName
     * @return
     */
    List<SysUser> findByRealName(String realName);

    /**
     * 根据真实姓名和角色ID查询用户列表，将查询条件封装成Java对象作为入参
     *
     * @param sysUser
     * @return
     */
    List<SysUser> findByPojo(SysUser sysUser);

    /**
     * 根据真实姓名和角色ID查询用户列表，将查询条件封装成Map作为入参
     *
     * @param param
     * @return
     */
    List<SysUser> findByMap(Map<String, Object> param);

    /**
     * 根据真实姓名和角色ID查询用户列表，使用@Param注解多参数方式传值
     *
     * @param realName 真实姓名
     * @param roleId 角色ID
     * @return
     */
    List<SysUser> findByParams(@Param("realName") String realName, @Param("roleId") Long roleId);

    /**
     * 根据真实姓名和角色ID查询用户列表，使用多个Java对象组合实现多参数方式传值
     *
     * @param sysUser
     * @return
     */
    List<SysUser> findByPojoParams(@Param("sysUser") SysUser sysUser, @Param("address") String address);

    /**
     * 根据真实姓名和角色ID查询用户列表（包含角色名称）
     *
     * @param realName
     * @param roleId
     * @return
     */
    List<SysUser> findUserWithUserRoleName(@Param("realName") String realName, @Param("roleId") Long roleId);

    /**
     * 根据真实姓名和角色ID查询用户及关联角色列表（包含一对一关联的角色对象）
     *
     * @param realName
     * @param roleId
     * @return
     */
    List<SysUser> findUserRoleOneToOne(@Param("realName") String realName, @Param("roleId") Long roleId);

    /**
     * 根据真实姓名和角色ID查询用户及关联的联系方式列表（包含一对多关联的联系方式集合）
     *
     * @return
     */
    List<SysUser> findUserContainAddressListOneToMany(@Param("realName") String realName, @Param("roleId") Long roleId);

    /**
     * 查询用户，包含用户角色（一对一）和联系方式（一对多）
     *
     * @return
     */
    List<SysUser> findUserRoleAndAddressByParams(@Param("realName") String realName, @Param("roleId") Long roleId);

    /**
     * 根据真实姓名角色ID和账号查询用户列表，使用@Param注解多参数方式传值（choose标签的使用）
     *
     * @param sysUser 用户对象
     * @return
     */
    List<SysUser> findUserByParams(@Param("sysUser") SysUser sysUser);

    /**
     * 根据角色ID列表查询用户（循环Integer[]数组）
     *
     * @param roleIds 角色ID列表
     * @return
     */
    List<SysUser> findUserByArray(@Param("roleIds") Integer[] roleIds);

    /**
     * 根据角色ID列表查询用户（循环List）
     *
     * @param roleIds 角色ID列表
     * @return
     */
    List<SysUser> findUserByList(@Param("roleIds") List<Integer> roleIds);

    /**
     * 根据角色ID列表查询用户（循环Map中的List值）
     *
     * @param roleIdMap 角色ID列表
     * @return
     */
    List<SysUser> findUserByMap(@Param("roleIdMap") Map<String, List<Integer>> roleIdMap);

    /**
     * 根据ID修改用户信息（设置了值的属性就修改，null值不修改）
     *
     * @param sysUser 修改的实体对象（通过ID对应到数据库中的记录）
     * @return
     */
    int updateUserById(SysUser sysUser);

    /**
     * 根据ID修改用户信息，通过trim标签（设置了值的属性就修改，null值不修改）
     *
     * @param sysUser 修改的实体对象（通过ID对应到数据库中的记录）
     * @return
     */
    int updateUserByIdTrim(SysUser sysUser);

    /**
     * 根据角色ID分页查询
     *
     * @param roleId
     * @param pageIndex 起始位置
     * @param pageSize 显示行数
     * @return
     */
    List<SysUser> findPageByRoleId(@Param("roleId") Long roleId, @Param("pageIndex")Integer pageIndex, @Param("pageSize")Integer pageSize);
}
